package Log4j;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * @author 李某
 * * @date 2021/10/27
 * *物有本末，事有终始。知其先后者，则近道矣！
 * *荷花开满池塘的前一天还是半塘荷花半塘云。
 */
public class TestLOG4J {


/**
 * @author 李某
 * * @date 2021/10/27
 * *物有本末，事有终始。知其先后者，则近道矣！
 * *荷花开满池塘的前一天还是半塘荷花半塘云。
 */
}

//    class Log4j.TestLog4j {
//        // 基于类获取日志对象
//        static Logger logger = Logger.getLogger(Log4j.TestLog4j.class);
//        public static void main(String[] args) throws InterruptedException {
//            // 进行默认的配置
//            BasicConfigurator.configure();
//            // 设置日志输出级别
//            logger.setLevel(Level.DEBUG);
//            // 进行不同级别日志的输出
//            logger.trace("跟踪信息");
//            logger.debug("调试信息");
//            logger.info("输出信息");
//            Thread.sleep(1000);
//            logger.warn("警告信息");
//            logger.error("错误信息");
//            logger.fatal("致命信息");
//
//        }
//    }

/**
 * 通常，我们写代码的过程中，免不了要输出各种调试信息。在没有使用任何日志工具之前，都会使用 System.out.println 来做到。 这么做直观有效，但是有一系列的缺点：
 * 1. 不知道这句话是在哪个类，哪个线程里出来的
 * 2. 不知道什么时候前后两句输出间隔了多少时间
 * 3. 无法关闭调试信息，一旦System.out.println多了之后，到处都是输出，增加定位自己需要信息的难度
 *
 * 为了应对这种情况，我们使用Log4j来进行日志输出。 采用如下代码，执行雷同的输出。 可以看到输出结果有几个改观：
 *
 * 1. 知道是log4j.TestLog4j这个类里的日志
 * 2. 是在[main]线程里的日志
 * 3. 日志级别可观察，一共有6个级别 TRACE DEBUG INFO WARN ERROR FATAL
 * 4. 日志输出级别范围可控制， 如代码所示，只输出高于DEBUG级别的，那么TRACE级别的日志自动不输出
 * 5. 每句日志消耗的毫秒数(最前面的数字)，可观察，这样就可以进行性能计算
 *
 *
 * 1 [main] DEBUG Log4j.TestLog4j  - 调试信息
 * 3 [main] INFO Log4j.TestLog4j  - 输出信息
 * 1016 [main] WARN Log4j.TestLog4j  - 警告信息
 * 1021 [main] ERROR Log4j.TestLog4j  - 错误信息
 * 1021 [main] FATAL Log4j.TestLog4j  - 致命信息
 *
 *
 */




// 修改后的版本

    /*
    然后修改TestLog4j，并运行。 有两个效果
    1. 输出在控制台，并且格式有所变化，如图所示，会显示是哪个类的哪一行输出的信息
    2. 不仅仅在控制台有输出，在把日志输出到了 E:\project\log4j\example.log 这个位置

    与 Log4j入门 中的BasicConfigurator.configure();方式不同，采用指定配置文件
    PropertyConfigurator.configure("e:\\project\\log4j\\src\\log4j.properties");
    Log4j的配置方式按照log4j.properties中的设置进行

    设置日志输出的等级为debug,低于debug就不会输出了
    设置日志输出到两种地方，分别叫做 stdout和 Rlog4j.rootLogger=debug, stdout, R

    第一个地方stdout, 输出到控制台

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    输出格式是 %5p [%t] (%F:%L) - %m%n, 格式解释在下个步骤讲解

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

    第二个地方R, 以滚动的方式输出到文件，文件名是example.log,文件最大100k, 最多滚动5个文件

    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=example.log
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=5

    输出格式是 %p %t %c - %m%n, 格式解释在下个步骤讲解

    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
     */

class TestLog4j {
    static Logger logger = Logger.getLogger(TestLog4j.class);
    public static void main(String[] args) throws InterruptedException {
        PropertyConfigurator.configure("d:\\project\\log4j\\src\\log4j.properties");
        for (int i = 0; i < 5000; i++) {
            logger.trace("跟踪信息");
            logger.debug("调试信息");
            logger.info("输出信息");
            logger.warn("警告信息");
            logger.error("错误信息");
            logger.fatal("致命信息");
        }
    }
}


/**
 * log4j日志输出格式一览：
 * %c 输出日志信息所属的类的全名
 * %d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy-MM-dd HH:mm:ss }，输出类似：2002-10-18- 22：10：28
 * %f 输出日志信息所属的类的类名
 * %l 输出日志事件的发生位置，即输出日志信息的语句处于它所在的类的第几行
 * %m 输出代码中指定的信息，如log(message)中的message
 * %n 输出一个回车换行符，Windows平台为“rn”，Unix平台为“n”
 * %p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL。如果是调用debug()输出的，则为DEBUG，依此类推
 * %r 输出自应用启动到输出该日志信息所耗费的毫秒数
 * %t 输出产生该日志事件的线程名
 *
 * 所以：
 * %5p [%t] (%F:%L) - %m%n 就表示
 * 宽度是5的优先等级 线程名称 (文件名:行号) - 信息 回车换行
 */



